package bz.ziro.kanbe.logic;

import java.util.List;

import javax.servlet.http.HttpServletRequest;

import bz.ziro.kanbe.dao.TemplateBrowserDao;
import bz.ziro.kanbe.dao.UserAgentDao;
import bz.ziro.kanbe.model.Template;
import bz.ziro.kanbe.model.TemplateBrowser;
import bz.ziro.kanbe.model.UserAgent;
import bz.ziro.kanbe.util.KeyFactory;

import com.google.appengine.api.datastore.Key;

/**
 * ブラウザデータのロジック
 * @author Administrator
 *
 */
public class BrowserLogic {

    /**
     * 適応するエージェントのブラウザを検索する
     * @param aTemplateKey
     * @param agentList
     * @param browserAgent
     * @return
     */
    public static TemplateBrowser findAgentBrowser(Key aTemplateKey,HttpServletRequest request) {

        List<TemplateBrowser> browserList = TemplateBrowserDao.all(aTemplateKey);
        //判定用に使用するエージェントを取得
        String browserAgent = request.getHeader("user-agent");

        //優先順位で取得
        List<UserAgent> agentList = UserAgentDao.findPriorityList();

        TemplateBrowser rtnBrowser = null;

        UserAgent defaultAgent = null;
        //エージェント数回繰り返す
        for ( UserAgent agent : agentList ) {
            //判定文を取得
            String wkJudge = agent.getJudge();
            if ( wkJudge == null || wkJudge.equals("") ) {
                defaultAgent = agent;
                continue;
            }
           
            String[] judgeArray = wkJudge.split(";");
            for ( String judge : judgeArray ) {

            	int idx = browserAgent.indexOf(judge);
            	//存在した場合
            	if ( idx > -1 ) {
 	               //ブラウザ数回繰り替えす。
 	               for ( TemplateBrowser browser : browserList ) {
 	                   Key wkKey = browser.getAgentKey();
 	                   //キーが同一だった場合
 	                   if ( wkKey.toString().equals(agent.getKey().toString()) ) {
 	                       rtnBrowser = browser;
 	                       break;
 	                   }
 	               }
            	}
	            if ( rtnBrowser != null ) break;
            }
        }

        //存在しない場合
        if ( rtnBrowser == null ) {
            //ブラウザ数回繰り替えす。
            for ( TemplateBrowser browser : browserList ) {
                Key wkKey = browser.getAgentKey();
                //キーが同一だった場合
                if ( wkKey.equals(defaultAgent.getKey()) ) {
                    rtnBrowser = browser;
                    break;
                }
            }
        }
        return rtnBrowser;
    }
    
    /**
     * 使用するブラウザとエージェントを取得
     * @param templateKey
     * @param key
     * @param newAgentList
     * @return
     */
    public static TemplateBrowser getUsingBrowser(Key templateKey,String key,List<UserAgent> newAgentList) {
    	
    	TemplateBrowser rtnBrowser = null;
        List<TemplateBrowser> browserList = TemplateBrowserDao.all(templateKey);
        //全件取得
        List<UserAgent> agentList = UserAgentDao.all();

        //キーが存在する場合
        if ( key != null && !key.equals("")) {
            Key browseKey = KeyFactory.createBrowserKey(templateKey,Long.valueOf(key));
            //検索する
            for ( TemplateBrowser wkBrowser : browserList ) {
                //キーが同一だったら
                if ( wkBrowser.getKey().equals(browseKey) ) {
                	rtnBrowser = wkBrowser;
                    Key agentKey = wkBrowser.getAgentKey();
                    //エージェントを探してコピーする
                    for ( UserAgent agent: agentList ) {
                        if ( agentKey.equals(agent.getKey()) ) {
                            newAgentList.add(agent);
                        }
                    }
                    break;
                }
            }
        } else {
            //エージェントリスト数回繰り返す
            for ( UserAgent agent: agentList ) {

                TemplateBrowser browser = null;
                //検索する
                for ( TemplateBrowser wkBrowser : browserList ) {
                    Key agentKey = wkBrowser.getAgentKey();
                    //同一の場合
                    if ( agentKey.equals(agent.getKey()) ) {
                        browser = wkBrowser;
                        break;
                    }
                }
                //存在しない場合
                if ( browser == null ) {
                   newAgentList.add(agent);
                }
            }
        }
        return rtnBrowser;
    }

    /**
     * ブラウザの名称に設定しておく
     * @param templateList
     * @param agentList 
     */
	public static void setName(List<Template> templateList, List<UserAgent> agentList) {
        //テンプレートのブラウザに名称を設定しておく
        for ( Template template : templateList ) {
            List<TemplateBrowser> browserList = TemplateBrowserDao.all(template.getKey());
            template.setBrowserList(browserList);
            //ブランザデータ数回繰り返す
            for ( TemplateBrowser browser : browserList ) {
                Key agentKey = browser.getAgentKey();
                for ( UserAgent agent : agentList ) {
                    if ( agent.getKey().equals(agentKey) ) {
                       browser.setName(agent.getName());
                       break;
                    }
                }
            }
        }
	}
}
